iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 17

Codewars Ruby Challenge - Day 17/30

  • 分享至 

  • xImage
  •  

學習

  1. 字元轉換成 # 字號的盲點:我的做法是著重在「把末四碼前面的每個字元都轉換成 #」,但龍哥的看法會是「末四碼前面的長度有多少,就做幾個 # 給它」
  2. Regular Expression 選取需要 # 的字元:每次遇到能用 RegEx 處理的問題,都會感受到它的強大,這次是用「.(?=….)」來選取末四碼前面的所有數字,這段的說明如下
# . 的意思是任意一個字元

# q(?=u) 會找出所有的 q,如果符合 q 後面接的是 u 的話
# 上述的原文:q(?=u) matches a q that is followed by a u

# .(?=….)的意思:找出任何 1 個字元,它的後面有接任何 4 個字元
# 上述轉換成人話:選取右邊數過來第 5 個字(含)以前的所有數字,因為最後4個字的每個字元右邊一定都不足4個字

題目:

# 幫信用卡號打馬賽克

def maskify(card_number)
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "幫信用卡號打馬賽克" do
    expect(maskify('4556364607935616')).to eq '############5616'
    expect(maskify('1')).to eq '1'
    expect(maskify('11111')).to eq '#1111'
  end
end

我的答案

def maskify(card_number)
  if card_number.length < 5
    card_number
  else
    last_four = card_number[-4..-1]
    head = card_number[0..-5]
    head = head.chars.map { |n| n = "#" }.join("")
    "#{head}#{last_four}"
  end
end

思路:

  1. 先處理字串長度小於5的情況,就是完全不用動的回傳
  2. 其他的情況則是先把末4碼存起來,前面的所有字元轉換成「#」
  3. 最後再把所有字元組合回來

龍哥建議的答案

def maskify(card_number)
  card_number.gsub(/.(?=....)/, "#")
end

上一篇
Codewars Ruby Challenge - Day 16/30
下一篇
Codewars Ruby Challenge - Day 18/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言